package pl.edu.pk.psb.validator;

import static org.apache.commons.lang3.StringUtils.isAlphaSpace;
import static org.apache.commons.lang3.StringUtils.isAlphanumericSpace;
import static org.apache.commons.lang3.StringUtils.isWhitespace;

public abstract class OgolnyValidator {
	
	/**
	 * Sprawdza czy podany ciag znakow to liczba calkowita dodatnia
	 * @param nazwa - ciag znakow do sprawdzenia
	 * @return True gdy ciag znakow spelnia wymagania
	 */
	protected boolean czyLiczbaCalkowitaDodatnia(String liczba) {
		try {
			int liczbaInteger = Integer.parseInt(liczba);
			if (liczbaInteger <= 0) {
				return false;
			}
		} catch (NumberFormatException e) {
			return false;
		}
		return true;
	}
	
	/**
	 * Sprawdza czy podany ciag znakow to liczba zmiennoprzecinkowa dodatnia z separatorem dziesietnym'.'
	 * @param nazwa - ciag znakow do sprawdzenia
	 * @return True gdy ciag znakow spelnia wymagania
	 */
	protected boolean czyLiczbaZmiennoprzecinkowaDodatnia(String liczba) {
		try {
			float liczbaFloat = Float.parseFloat(liczba);
			if (liczbaFloat <= 0) {
				return false;
			}
		} catch (NumberFormatException e) {
			return false;
		}
		return true;
	}
	
	/**
	 * Sprawdza czy ciag znakow zawiera znaki unicode, cyfry lub spacje(ale nie wylacznie spacje), oraz ma miedzy 1(wlacznie) a 255(wlacznie) znakow
	 * @param nazwa - ciag znakow do sprawdzenia
	 * @param czyCyfry - czy w ciagu moga wystepowac cyfry czy nie
	 * @return True gdy ciag znakow spelnia wymagania
	 */
	protected boolean czyPoprawnyString(String nazwa, boolean czyCyfry) {
		return czyPoprawnyString(nazwa, 0, 256, czyCyfry);
	}
	
	/**
	 * Sprawdza czy ciag znakow zawiera znaki unicode, cyfry lub spacje(ale nie wylacznie spacje) oraz ma minimum jeden znak, a maksimum jest podane jako parametr)
	 * @param nazwa - ciag znakow do sprawdzenia
	 * @param maksymalnaDlugosc - maksymalna ilosc znakow
	 * @param czyCyfry - czy w ciagu moga wystepowac cyfry czy nie
	 * @return True gdy ciag znakow spelnia wymagania
	 */
	protected boolean czyPoprawnyString(String nazwa, int maksymalnaDlugosc, boolean czyCyfry) {
		return czyPoprawnyString(nazwa, 0, maksymalnaDlugosc, czyCyfry);
	}
	
	/**
	 * Sprawdza czy ciag znakow zawiera znaki unicode, cyfry lub spacje(ale nie wylacznie spacje) oraz zawiera sie w przedziale ilosc znakow podanych w argumentach)
	 * @param nazwa - ciag znakow do sprawdzenia
	 * @param minimalnaDlugosc - minimalna ilosc znakow
	 * @param maksymalnaDlugosc - maksymalna ilosc znakow
	 * @param czyCyfry - czy w ciagu moga wystepowac cyfry czy nie
	 * @return True gdy ciag znakow spelnia wymagania
	 */
	protected boolean czyPoprawnyString(String nazwa, int minimalnaDlugosc, int maksymalnaDlugosc, boolean czyCyfry) {
		if (minimalnaDlugosc < 0) {
			minimalnaDlugosc = 0;
		}
		boolean typZnakow = czyCyfry ? isAlphanumericSpace(nazwa) : isAlphaSpace(nazwa);

		return typZnakow && !isWhitespace(nazwa) && nazwa.length() > minimalnaDlugosc && nazwa.length() < maksymalnaDlugosc;
		
	}

}
